package ar.utn.frgp.banco.front.action.plazofijo;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import ar.utn.frgp.banco.dto.PlazoFijoDTO;
import ar.utn.frgp.banco.dto.UserDTO;
import ar.utn.frgp.banco.entity.Cuenta;
import ar.utn.frgp.banco.entity.PlazoFijo;
import ar.utn.frgp.banco.entity.enums.Acreditacion;
import ar.utn.frgp.banco.entity.enums.OrigenFondos;
import ar.utn.frgp.banco.exceptions.PersonalisedException;
import ar.utn.frgp.banco.front.action.EBAbstractAction;
import ar.utn.frgp.banco.front.constants.Constantes;
import ar.utn.frgp.banco.service.PlazoFijoService;

public class CrearPlazoFijoAction extends EBAbstractAction implements SessionAware{

	/**
	 * 
	 */
	private static final long serialVersionUID = 6765753524259559635L;

	private PlazoFijoService plazoFijoService;
	
	private PlazoFijoDTO plazoFijoDTO;
	
	private Long idCuenta;
	
	private int dias;
	
	Map<String, Object> session;
	
	@Override
	public String execute() throws PersonalisedException {
		
		PlazoFijo plazoFijo = new PlazoFijo();
		if(plazoFijoDTO != null){
			
			plazoFijo.setFechaAlta(new Date());
			
			Calendar cal = new GregorianCalendar();
			cal.setTime(plazoFijo.getFechaAlta());
			cal.add(Calendar.DAY_OF_MONTH, dias);
			plazoFijo.setFechaVencimiento(cal.getTime());
			
			if(dias >= 90){
				plazoFijo.setInteres(Constantes.PLAZO_FIJO_INTERESES_90_DIAS);
			}else if(dias == 60){
				plazoFijo.setInteres(Constantes.PLAZO_FIJO_INTERESES_60_DIAS);
			}else if(dias == 30){
				plazoFijo.setInteres(Constantes.PLAZO_FIJO_INTERESES_30_DIAS);
			}else{
				return ERROR;
			}
			UserDTO uDto = (UserDTO) session.get(Constantes.USER_LOGGED_BEAN);
			plazoFijo.setDni(uDto.getDni());
			
			plazoFijo.setOrigenPlazo(OrigenFondos.obtenerOrigenFondos(plazoFijoDTO.getOrigen()));
			
			plazoFijo.setAcreditacion(Acreditacion.obtenerAcreditacion(plazoFijoDTO.getAcreditacion()));
			
			if(plazoFijoDTO.getCuentaDestino() != null && !"".equals(plazoFijoDTO.getCuentaDestino())){
				Cuenta ctaDestino = new Cuenta();
				ctaDestino.setNumero(new Long(plazoFijoDTO.getCuentaDestino()));
				plazoFijo.setCuentaDestino(ctaDestino);				
			}
			
			plazoFijo.setMonto(new BigDecimal(plazoFijoDTO.getMonto()));
			
			try {
				if(idCuenta != null){
					plazoFijoService.crearPlazoFijo(plazoFijo,idCuenta);									
				}else{
					plazoFijoService.crearPlazoFijo(plazoFijo);
				}
			} catch (Exception e) {
				
			}
		}	
		return SUCCESS;
	}

	public void validate(){
		
		if(plazoFijoDTO.getMonto() == null || "".equals(plazoFijoDTO.getMonto())){
			addFieldError("plazoFijoDTO.Monto", getText("forms.requerido"));
		}
	}
	
	public PlazoFijoService getPlazoFijoService() {
		return plazoFijoService;
	}

	public void setPlazoFijoService(PlazoFijoService plazoFijoService) {
		this.plazoFijoService = plazoFijoService;
	}

	public PlazoFijoDTO getPlazoFijoDTO() {
		return plazoFijoDTO;
	}

	public void setPlazoFijoDTO(PlazoFijoDTO plazoFijoDTO) {
		this.plazoFijoDTO = plazoFijoDTO;
	}

	public int getDias() {
		return dias;
	}

	public void setDias(int dias) {
		this.dias = dias;
	}

	public Long getIdCuenta() {
		return idCuenta;
	}

	public void setIdCuenta(Long idCuenta) {
		this.idCuenta = idCuenta;
	}

	@Override
	public void setSession(Map<String, Object> arg0) {
		this.session = arg0;
		
	}
	
}
